#include "Math3D.h"

namespace MASGK
{

	// Dot product
	float dot(float3 _a, float3 _b)
	{
		return _a.x * _b.x + _a.y * _b.y + _a.z * _b.z;
	}

	float dot(float4 _a, float4 _b)		// Not checked!
	{
		return _a.x * _b.x + _a.y * _b.y + _a.z * _b.z + _a.w * _b.w;
	}

	// Cross product
	float3 cross(float3 _a, float3 _b)
	{
		return float3
			(
				_a.y * _b.z - _a.z * _b.y,
				_a.z * _b.x - _a.x * _b.z,
				_a.x * _b.y - _a.y * _b.x
			);
	}

	int min (int _num, int _num2, int _num3)
	{
		return _num < _num2 ? (_num < _num3 ? _num : _num3) : (_num2 < _num3 ? _num2 : _num3);
	}

	int max (int _num, int _num2, int _num3)
	{
		return _num > _num2 ? (_num > _num3 ? _num : _num3) : (_num2 > _num3 ? _num2 : _num3);
	}

	float4 mul(float4 _vec, float4x4 _mat)
	{
		return float4
				(
					_vec.x * _mat[0].x + _vec.y * _mat[0].y + _vec.z * _mat[0].z + _vec.w * _mat[0].w,
					_vec.x * _mat[1].x + _vec.y * _mat[1].y + _vec.z * _mat[1].z + _vec.w * _mat[1].w,
					_vec.x * _mat[2].x + _vec.y * _mat[2].y + _vec.z * _mat[2].z + _vec.w * _mat[2].w,
					_vec.x * _mat[3].x + _vec.y * _mat[3].y + _vec.z * _mat[3].z + _vec.w * _mat[3].w
				);
	}
}